#pragma once
/*
    各种小功能接口
*/

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>

class Util
{
    public:
        static int ReadLine(int sock, std::string& out) //out 输出型参数
        {
            // xxxxx\n   xxxxx\r\n    xxxxx\r
            char ch = 'x';
            while (ch != '\n')
            {
                ssize_t s = recv(sock, &ch, 1, 0);
                if(s > 0)
                {
                    if(ch == '\r')
                    {
                        // \r  \r\n
                        //需要特殊处理 ,但不能直接recv读取下一个字符判断是否是\n
                        //因为万一不是\n 就会把下一行的字符读走，导致下一行会少一个字符
                            //数据窥探功能：：recv的最后一个参数flag ：MES_PEEK
                        recv(sock, &ch, 1, MSG_PEEK);//现在 ch的值就是\r的下一个，并且TCP缓冲区内的字符并未被取走
                        if(ch == '\n')
                        {
                            recv(sock, &ch, 1, 0); //这一次就是读走 \n
                        }
                        else
                            ch = '\n';
                    }
                    // 至此，就保证了ch内，只能是 普通字符 或者是被转换后的 \n
                    out.push_back(ch);
                }
                else if(s == 0) 
                    return 0;
                else 
                    return -1;
            }
            return out.size();
            
        }
};